package com.ejd.service;
import java.util.List;


import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

import com.ejd.hibernate.dao.support.Page;


/**
 * 增删改查公共服务接口
 */
public interface IOperateService<T,PK> {

	/**
	 * 设置实体类型
	 * @param type
	 */
	public abstract void setEntityClass(Class<T> entity);
	
	/**
	 * 设置主码类型
	 * @param type
	 */
	public abstract void setPKClass(Class<PK> pk);

	/**
	 * {@inheritDoc}
	 */
	public T save(T object);
	/**
	 * 删除
	 * 
	 * @param persistentInstance
	 */
	public abstract void delete(PK id);

	/**
	 * {@inheritDoc}
	 */
	public boolean exists(PK id);
	/**
	 * 附加
	 * 
	 * @param detachedInstance
	 * @return
	 */
	public abstract T merge(T detachedInstance);

	
	/**
	 * 分页查询函数，使用已设好查询条件与排序的<code>Criteria</code>.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 * @return 含总记录数和当前页数据的Page对象.
	 */
	public Page<T, PK> pagedQuery(Criteria criteria, int pageNo, int pageSize);
	
	/**
	 * 分页查询函数，根据entityClass和查询条件参数创建默认的<code>Criteria</code>.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 * @return 含总记录数和当前页数据的Page对象.
	 */
	public Page<T, PK> pagedQuery(int pageNo, int pageSize, Criterion... criterions);
	
	/**
	 * 分页查询函数，根据entityClass和查询条件参数,排序参数创建默认的<code>Criteria</code>.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 * @return 含总记录数和当前页数据的Page对象.
	 */
	public Page<T, PK> pagedQuery(int pageNo, int pageSize, String orderBy, boolean isAsc, Criterion... criterions);
	public Page<T, PK> pagedQuery(int pageNo, List<Criterion> filterList, List<Order> orderList);
	
	/**
	 * 分页查询函数，使用hql.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 */
	public Page<T, PK> pagedQuery(String hql, int pageNo, int pageSize, Object... values);
	
	/**
	 * {@inheritDoc}
	 */
	public void remove(PK id);
	
	/**
	 * 根据ID删除对象.
	 */
	public void removeById(PK id);
	/**
	 * 删除对象.
	 */
	public void removeEntity(T entity);
	/**
	 * 更新或保存
	 * 
	 * @param instance
	 */
	public abstract void saveOrUpdate(T instance);


	/**
	 * 按ID查找
	 * 
	 * @param id
	 * @return
	 */
	public abstract T findById(PK id);

	/**
	 * 按条件查找
	 * 
	 * @param instance
	 * @return
	 */
	public abstract List<T> findByExample(T instance);

	/**
	 * 检查是否存在
	 * @param usertemp
	 */
	public abstract boolean ifExistBy(String propertyName, Object value);

	/**
	 * 根据hql查询,直接使用HibernateTemplate的find函数.
	 * 
	 * @param values
	 *            可变参数
	 */
	public List<T> find(String hql, Object... values);
	/**
	 * 按条件查找
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public abstract List<T> findBy(String propertyName, Object value);
	
	/**
	 * 根据属性名和属性值查询对象,带排序参数.
	 */
	public List<T> findBy(String propertyName, Object value, String orderBy, boolean isAsc);
	/**
	 * 按条件查找(唯一值)
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public  abstract T findUniqueBy(String propertyName, Object value);
	/**
	 * 执行一些必须的sql语句把内存中的对象同步到jdbc的链接中
	 */
	public void flush();
	
	/**
	 * {@inheritDoc}
	 */
	public T get(PK id);
	
	/**
	 * {@inheritDoc}
	 */
	public List<T> getAll();
	
	/**
	 * 获取全部对象,带排序字段与升降序参数.
	 */
	public List<T> getAll(String orderBy, boolean isAsc);
	
	public Criteria createCriteria(Criterion... criterions);

	/**
	 * 创建Criteria对象，带排序字段与升降序字段.
	 */
	public Criteria createCriteria(String orderBy, boolean isAsc, Criterion... criterions);

	
	
	/**
	 * @param hql
	 *            查询sql
	 * @param start
	 *            分页从哪一条数据开始

	 * @param pageSize
	 *            每一个页面的大小
	 * @param values
	 *            查询条件
	 * @return page对象
	 */
	public Page dataQuery(String hql, int start, int pageSize, Object... values);
}